//! # State
//!
//! 牌局数据控制器
//!
//! 所有的 Cards 都是索引

/// 牌局数据控制器
#[derive(Debug, Clone, Default)]
pub struct State {
    /// 牌堆初始数目
    ///
    /// 初始化之后不再修改
    count: usize,

    /// 玩家卡组控制器
    pub owners: Vec<super::Owner>,

    /// 牌堆
    ///
    /// 可摸牌
    pub cards: Vec<usize>,

    /// 弃牌堆
    pub discards: Vec<usize>,
}

impl State {
    /// 从卡组初始化 State
    ///
    /// 卡组在开始的时候需要打乱
    ///
    pub(super) fn new(cards: Vec<usize>, plays_count: usize) -> Self {
        let count = cards.len();
        let owners = (0..plays_count)
            .into_iter()
            .map(|index| super::Owner::new(index))
            .collect();

        Self {
            count,
            cards,
            owners,
            ..Default::default()
        }
    }

    /// 返回原始卡组长度
    ///
    /// 理论上于 Runner 内 Vec<Card> 长度相同
    pub fn initial_count(&self) -> usize {
        self.count
    }

    /// 以及分配的卡组总数
    pub fn cards_count(&self) -> usize {
        self.cards.len()
            + self.discards.len()
            + self.owners.iter().map(|v| v.count()).sum::<usize>()
    }

    /// 检查卡组总数
    ///
    /// 当数量不一致时直接 panic
    pub fn check_cards(&self) {
        assert_eq!(self.initial_count(), self.cards_count())
    }
}
